/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年10月12日
 * 项目： rainhy-property
 */
package com.rainhy.property.manager.springdata.service;

import java.util.List;

import javax.annotation.Resource;

import org.joda.time.DateTime;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rainhy.property.manager.springdata.dao.PropertyDao;
import com.rainhy.property.manager.springdata.entity.PropertyEntity;
import com.rainhy.webcore.holder.WebContextHolder;

/**
 * 属性 Service
 * 
 * @author rain
 * @version [版本号, 2016年10月12日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@Service("com.rainhy.property.manager.springdata.service")
public class PropertyService {
    
    @Resource(name = "com.rainhy.property.manager.springdata.dao")
    private PropertyDao dao;
    
    /** 所有属性数量 */
    public long count() {
        return dao.count();
    }
    
    /** 删除所有属性 */
    @Transactional
    public void deleteAll() {
        dao.deleteAllInBatch();
    }
    
    /** 删除属性 */
    @Transactional
    public void deleteByKey(String propertyKey) {
        PropertyEntity pe = new PropertyEntity();
        pe.setPropertyKey(propertyKey);
        List<PropertyEntity> PropertyEntities = dao.findAll(Example.<PropertyEntity> of(pe));
        dao.deleteInBatch(PropertyEntities);
    }
    
    /** 删除属性 */
    @Transactional
    public void deleteByTypeAndKey(String propertyType, String propertyKey) {
        PropertyEntity propertyEntity = findByTypeAndKey(propertyType, propertyKey);
        dao.delete(propertyEntity);
    }
    
    @Transactional
    public void deleteById(String propertyId) {
        this.dao.delete(propertyId);
    }
    
    /** 根据 ID 查询 */
    public PropertyEntity findById(String id) {
        return dao.findOne(id);
    }
    
    /**
     * 根据属性类型和属性 key 查询属性
     *
     * @param propertyType 属性类型
     * @param propertyKey 属性 key
     * 
     * @return PropertyEntity 属性
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月12日]
     * @author rain
     */
    public PropertyEntity findByTypeAndKey(String propertyType, String propertyKey) {
        PropertyEntity pe = new PropertyEntity();
        pe.setPropertyType(propertyType);
        pe.setPropertyKey(propertyKey);
        return dao.findOne(Example.<PropertyEntity> of(pe));
    }
    
    /** 保存属性 */
    @Transactional
    public void save(PropertyEntity property) {
        DateTime now = DateTime.now();
        String loginKey = null;
        if (WebContextHolder.logined()) {
            loginKey = WebContextHolder.loginKey();
        }
        
        if (property.isNew()) {
            property.setCreatedBy(loginKey);
            property.setCreatedDate(now);
        }
        property.setLastModifiedBy(loginKey);
        property.setLastModifiedDate(now);
        dao.save(property);
    }
    
}
